gtk: Implement cursor updates
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 31 Mar 2017 15:54:06 +0000 (17:54 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Thu, 25 May 2017 14:25:58 +0000 (16:25 +0200)
As we don't obey GdkWindow cursors anymore, someone must set those.
Use the private Gtkwidget API at the moment.

gtk/gtkmain.c

index c2593ed7727930e6b8f4ebe6a6feedae5cef110c..8114ea8a17d7db022a86a82329aaf4fcfbf1f78c 100644 (file)
@@ -1301,6 +1301,23 @@ check_event_in_child_popover (GtkWidget *event_widget,
   return (popover_parent == grab_widget || gtk_widget_is_ancestor (popover_parent, grab_widget));
 }
 
+static void
+update_cursor (GtkWindow *toplevel,
+               GdkDevice *device,
+               GtkWidget *target)
+{
+  GdkCursor *cursor = NULL;
+
+  while (!cursor && target)
+    {
+      cursor = gtk_widget_get_cursor (target);
+      target = _gtk_widget_get_parent (target);
+    }
+
+  gdk_window_set_device_cursor (gtk_widget_get_window (GTK_WIDGET (toplevel)),
+                                device, cursor);
+}
+
 static GdkNotifyType
 get_virtual_notify_type (GdkNotifyType notify_type)
 {
@@ -1485,6 +1502,8 @@ handle_pointing_event (GdkEvent *event)
     case GDK_ENTER_NOTIFY:
       target = _gtk_toplevel_pick (toplevel, x, y, NULL, NULL);
       old_target = update_pointer_focus_state (toplevel, event, target);
+      if (event->type == GDK_MOTION_NOTIFY || event->type == GDK_ENTER_NOTIFY)
+        update_cursor (toplevel, device, target);
 
       /* Let it take the effective pointer focus anyway, as it may change due
        * to implicit grabs.